<?php
/*
Copyright (C) 2009 de Flotte Maxence

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
?>
<?php
/**
 * @author de Flotte Maxence <xamax87@gmail.com>
 * @package std
 * @version 1.0
 */
/**
 * Classe mère de tous les objets puZZle
 * @package std
 */
class std_Bout {
/**
 * @var string nom de l'objet
 */
	protected $name;
/**
 * @var array liste des objets apartenant à l'objet lui même
 */
	protected $_Object;
/**
 * @var string code html, fourni par la méthode buildStatic
 */
	protected $codeBuilt;
/**
 * @var string
 */
	protected $inner;
/**
 * @var string
 */
	protected $_arg = null;
/**
 * @var string
 */
	protected $_Flux;
/**
 * @var string url du fichier php
 */
	protected $url = 'std/boot.php';
/**
 * @var string nom de la classe
 */
	protected $bootName = 'Boot';
/**
 * @var page pointer vers l'objet page
 */
	public $page = null;
/**
 * @var bool l'objet est-il statique (ne sert plus à rien ?)
 */
	public $isStatic = false;
/**
 * @var string liste de seter à retenir lors de la mise en cache d'un objet dynamique
 */
	private $_autoSet;
/**
 * @var string liste de seter à retenir lors de la mise en cache d'un objet dynamique
 */
	private $_store = array();
/**
 * @var array liste des variables de configuration
 */
	protected $_conf = array();
/**
 * @var string nom du fichier de configuration
 */
	protected $confFileName;
/**
 * @var bool la méthode Me a elle était déjà utilisée ?
 */
	protected $isMeWasUsed = false;
	protected $IO = null;
	protected $firstIO = true;

/**
 * Constructeur
 * @param int $name nom de l'objet puZZle
 * @param PAGE $page pointeur vers l'objet PAGE
 */
	public function __construct($name,$page) {
		$this->name = $name;
		$this->page = $page;
		$this->url = str_replace('_','/',strToLower(get_class($this))).'.php';
		$this->bootName = get_class($this);
		if(method_exists($this,'construct'))
			$this->construct();
	}
/**
 * Ajoute les codes html de retour d'un objet puZZle dans lui-même
 * @param string $Inner retour de l'autre objet
 */
	public function sendObjBuiltIntoInner($Inner) {
		$this->inner .= $Inner."\n";
	}
/**
 * Definit le contenu de l'inner le l'objet
 * @param string $inner code html
 */
	public function setInner($inner) {
		$this->inner = $inner;
	}
/**
 * Ajoute un flux
 * @param string $flux nom du flux
 * @param string $Type type du flux
 */
	public function addFlux($Flux, $Type) {
		$this->_Flux[] = array('flux' => $Flux,'type' => $Type);
	}
/**
 * Ajoute un objet dans l'une des propriètés de l'objet
 * @param string $Var nom de la propriétè
 * @param Bout $Obj poiteur sur l'objet
 */
	public function AddObject2($Var,$Obj) {
		if ($this->_Object[$Var] == NULL)
			$this->_Object[$Var][] = $Obj; 
		if(!in_array($Obj,$this->_Object[$Var]))
			$this->_Object[$Var][] = $Obj;
	}
/**
 * Rapporte une erreur, et empéche la mise en cache
 * @param string $msg message à enregister dans le rapport d'erreur
 */
	protected function reportError($msg = null) {
		if($this->page != null)
			$this->page->noCache = true;
		$file = fopen('./Log/errors.log','a+');
		fwrite($file,date('d/m/Y H/i/s').' : '.$_SERVER['REQUEST_URI'].' : '.$_SERVER['HTTP_REFERER'].' : '.$msg."\n");
		fclose($file);
	}
/**
 * Calcule le resultat des objets contenus dans $this->_Object
 */
	public function buildListObject() {
		/*foreach($this As $key => $value) {
			$nkey = N.$key;
			$this->nkey = $this->$key;
		 }*/
		if ($this->_Object != NULL) {
			foreach($this->_Object	as $key => $array) {
	$methode = 'sendObjBuiltInto'.$key;
	//$nkey = N.$key;
	//$this->$key = $this->$nkey;
	foreach($array as $i => $value) {
		$this->$key .= $this->$methode($value->buildBout());
	}
			}
		}
	}
/**
 * Calcule le resultat statique des objets contenus dans $this->_Object
 */
	public function buildStaticListObject() {
		/*foreach($this As $key => $value) {
			$nkey = N.$key;
			$this->nkey = $this->$key;
		 }*/
		if ($this->_Object != NULL) {

			foreach($this->_Object	as $key => $array) {
	$methode = 'sendObjBuiltInto'.$key;
	//$nkey = N.$key;
	//$this->$key = $this->$nkey;
				foreach($array as $i => $value) {
					$this->$key .= $this->$methode($value->buildStaticBout());
				}
			}
		}
	}
/**
 * Calcule le resultat de notre objet
 */
	public function buildBout($buildTree = true) {
		if(isset($this->codeBuilt))
			return $this->codeBuilt;
		else {
			//$this->readFlux;
			if($buildTree)
				$this->buildListObject();
			$build = $this->build();
			if(is_array($build)) {
				$view = new ZzView(strToLower($this->bootName),$build);
				$build = $view->open();
			}
			return $this->codeBuilt = $build;
		}
	}
/**
 * Calcule le resultat statique de notre objet
 */
	public function buildStaticBout() {
		if(isset($this->codeBuilt))
			return $this->codeBuilt;
		else {
			$this->buildStaticListObject();
			if(method_exists($this,'buildStatic')) {
				$build = $this->buildStatic();
				if(is_array($build)) {
					$view = new ZzView(strToLower($this->bootName),$build);
					$build = $view->open();
				}
				return $this->codeBuilt = $build.$this->Me();
			}
			else {
				return $this->codeBuilt = $this->buildBout(false);
			}
		}
	}
/**
 * Definition de buidStatic(), retourne le resultat de build()
 * @return string
 */
	/*public function buildStatic() {
		$this->isStatic = true;
		return $this->build($this);
	}*/

/**
 * Ouverture du fichier de configuration
 * @return void
 */
	protected function openConfFile() {
		if(empty($this->confFileName))
			$this->setConfFile($this->bootName);
		if(!file_exists('./ZzConf/'.$this->confFileName))
			return false;
		$confFile = file_get_contents('./ZzConf/'.$this->confFileName);
		$this->_conf = unserialize($confFile);
		return true;
	}
	
/**
 * Sauvegarde du fichier de configuration
 * @return void
 */
	protected function saveConfFile() {
		if(empty($this->confFileName))
			$this->setConfFile($this->bootName);
		$confFile = serialize($this->_conf);
		file_put_contents('./ZzConf/'.$this->confFileName,$confFile);
	}
	
/**
 * Définition du fichier de configuration
 * @return void
 */
	public function setConfFile($confFileName) {
		$this->confFileName = strToLower($confFileName).'.conf.php';
	}
	

	//Interprétation des évènement
	protected function event($obj,$action) {
		return 'reLoadBoot(\''.$obj.'\',\''.$action.'\');';
	}

	protected function addArgument($arg) {
		if($this->page ==null and $this->_arg==null)
			$this->onEvent();
		$this->_arg .= '&set'.$arg.'='.$this->$arg;
	}
	protected function writeArgument() {
		return '<arg arg="'.$this->_arg.'"/>';
	}
	//protected function addArgument($obj,$action) {
//
	//return 'reLoadBoot(\''.$obj.'\',\''.$action.'\');';

 // }
	//Interprétation des évènement
	protected function addListener($e,$declencheur,$action,$obj) {

//Execution de la fonction
		if($this->page == null)
			$this->$action();

//Récupération des paramètre
		foreach($this as $key => $value)
			if ($key != 'page' and $key != '_Object' and $key != '_Flux' and $key != 'codeBuilt' and $key != 'isStatic' and $key != 'name' and $key != 'url')
				$arg .= '&set'.$key.'='.$value;

//Action
		$arg = 'reLoad(\''.$this->name.'\',\''.$arg.'\');';
//Ajout du déclancheur
		return '<script type="text/javascript">
		<!--
		alert("rr");
		addDeclencheur("'.$obj.'","'.$e.'","'.$arg.'");
		alert("rr");
		//-->
		</script>';

		/*if($e == 'onClick') {
			return 'onClick="reLoad(\''.$this->name.'\',\''.$arg.'\');"';
		}
		elseif($e == 'onFocus') {
			return 'onFocus="reLoad(\''.$this->name.'\',\''.$arg.'\');"';
		}
		elseif($e == 'onChange') {
			return 'onChange="reLoad(\''.$this->name.'\',\''.$arg.'\');"';
		}
		elseif($e == 'onMouseOver') {
			return 'onMouseOver="reLoad(\''.$this->name.'\',\''.$arg.'\');"';
		}*/

	}

/**
 * Recupèrer une instance de la classe ZzIO
 */
	function getIO() {
		if($this->firstIO) {
				$this->firstIO = false;
				return ZzIO::getCleanedInstance();
			}
		return ZzIO::getInstance();
	}
	
/**
 * Rend dynamique un objet
 * @return string
 */
	//Me :: permet de rendre dynamique un objet
	function Me() {
		if($this->isMeWasUsed)
			return null;
		//Me viens d'être utilisée
			$this->isMeWasUsed = true;
		
		
		$autoSet = null;
		if(isSet($this->_autoSet))
			foreach($this->_autoSet as $arg) {
				$autoSet .= '
	$'.$this->name.'->set'.$arg.'(\''.$this->$arg.'\');';
			}
		else
			$autoSet = null;
		
		$store = null;
		foreach($this->_store as $arg) {
				$store .= '	$'.$this->name.'->unStore('.$arg.',\''.serialize($this->$arg).'\');
';
			}
$GLOBALS['bouts'][] = array('name' => $this->name, 'bootName' => $this->bootName, 'url' => $this->url, 'autoset' => $autoSet,'store' => $store);
		return "
<?php
	echo $$this->name->buildBout();
?>";

	}
/**
 * Enregistre la propriété $arg d'un l'objet dynamique dans la cache
 * @param string $arg paramètre
 * @return void
 */
	//AutoSet
	protected function addAutoSet($arg) {
		$this->_autoSet[] = $arg;
	}
	
/**
 * Stock un objet pour le rendre accessible dans la partie dynamique depuis la partie statique
 * @param string $arg paramètre
 * @return void
 */
	protected function store($arg) {
		$this->_store[] = $arg;
	}
	/**
 * Sort du stoque un objet pour le rendre accessible dans la partie dynamique depuis la partie statique
 * @param string $arg paramètre
 * @return void
 */
	public function unStore($arg,$val) {
		$this->$arg = unserialize($val);
	}
/**
 * Ouvre une pièce en tant que pièce dynamique
 * @param string $class nom de la classe
 * @return string
 */
	protected function openBout($class) {
		$obj = new $class('noname',null,$class);
		
		return $obj->buildStatic().$obj->Me();
	}
	
/**
 * Inclue un fichier php dans le fichier cache
 * @param string $file nom du fichier
 * @return string
 */
	protected function openPhpFile($file) {
		$url = strToLower(str_replace('_','/',$file)).'.php';
		return '<?php include \''.$GLOBALS['cwd'].'/ZzO/'.$url.'\' ?>';
	}
}
?>